package ru.chaykin.measures;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.microedition.khronos.opengles.GL10;

import ru.chaykin.graphdrawers.Pen;
import ru.chaykin.primitives.Point;


public class Ranging extends Measure {

	private static final int MAX_SIZE = 128;
	private Pen linesPen;
	
	public Ranging(Pen linesPen, float radius) {
		this.linesPen=linesPen;
		this.radius = radius;
		startSize = radius;
		ByteBuffer bb = ByteBuffer.allocateDirect(12 * MAX_SIZE);	//Максимальное число точек полигона - 128
		bb.order(ByteOrder.nativeOrder());
		linesBuff = bb.asFloatBuffer();
		ByteBuffer lbb = ByteBuffer.allocateDirect(12 * 2);	//Максимальное число точек полигона - 128
		lbb.order(ByteOrder.nativeOrder());
	}
	
	public void add(Point p) {
		if (size < MAX_SIZE) {
			linesBuff.position(3 * size);
			linesBuff.put(p.getx());
			linesBuff.put(p.gety());
			linesBuff.put(Point.z);
			linesBuff.position(0);
			initMarksBuff();
			buildCircle(size, p, radius);
			size++;
		}
		else {
			linesBuff.clear();
			marksBuffs.clear();
			add(p); //Типа рекурсия...
		}
	}

	public void draw(GL10 gl) {
		if (linesBuff != null) {	//Словил NullPointerException. Вызвано неправильным порядком вызова обработчиков
			linesPen.applayToScene(gl);
			gl.glVertexPointer(3, GL10.GL_FLOAT, 0, linesBuff);
			gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, size);
			for (int i = 0; i < size; i++) {
				gl.glVertexPointer(3, GL10.GL_FLOAT, 0, marksBuffs.get(i));
				gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, ANGLES);
			}
		}
	}

	public String getMeasuredData() {
		if (size >= 2) {
			float dst = 0;
			for (int i = 0; i < 3 * (size - 1); i += 3) {
				dst += Point.distance(linesBuff.get(i), linesBuff.get(i + 1), linesBuff.get(i + 3), linesBuff.get(i + 4));
			}
			int fS = (int) (dst * 1000f);
			return fS / 1000.0 +"";
		}		
		return "";
	}
}
